
/**
 @file Message.h
 @brief Definición de la clase Mensaje.
 @date   2/12/2012
 @version v.0.9
 @author Julian Ovalle
         julianovalle@ula.ve
*/

#ifndef MESSAGE_CLASS_H_
#define MESSAGE_CLASS_H_

//#include <inttypes.h>
#include <cliMsgDef.h>

/**@brief Representa un mensaje manejado por el servicio de intercambio de mensajes. */
class Message {
    uint8_t _len; //!< Tamaño de la data en el mensaje.
    uint8_t _options; //!< Byte de opciones.
    uint8_t _type; //!< Identificador del comando o mensaje enviado.
    uint8_t* _data; //!< Apuntador a la data.
    char* _nodeId; //!< Identificador del nodo origen/destino.
public:

    /**
      * @brief Constructor que inicializa los atributos principales a cero y aparta memoria para el identificador
      */
    Message();

    /**
      * @brief Obtiene un apuntador a la data del mensaje
      */
    uint8_t* getData();

    /**
      * @brief Asigna el apuntador a la data del mensaje
      * @param apuntador a un buffer de bytes @see MAX_TX_DATA_LEN
      */
    void setData(uint8_t* data);

    /**
      * @brief Obtiene el tamaño de la data presente en el mensaje
      */
    uint8_t getLen();

    /**
      * @brief Modifica el tamaño de la data presente en el mensaje
      */
    void setLen(uint8_t len);

    /**
      * @brief Obtiene el byte de opciones del mensaje
      */
    uint8_t getOptions();

    /**
      * @brief Asigna el byte de opciones del mensaje. Pueden activarse varias opciones a la vez mediante OR OPCION1 | OPCION2...
      */
    void setOptions(uint8_t options);

    /**
      * @brief Activa un bit de opción en el mensaje.
      */
    void setOptionBit(uint8_t option);

    /**
      * @brief Obtiene el identificador de mensaje
      */
    uint8_t getType();

    /**
      * @brief Asigna el identificador de mensaje. @see cliMsgDef
      */
    void setType(uint8_t type);

    /**
      * @brief Obtiene el identificador de nodo origen/destino
      */
    char* getNodeId();

    /**
      * @brief Asigna el identificador de nodo origen/destino
      */
    void setNodeId(char* id);

    /**
      * @brief Convierte eñ mensaje en una trama de capa aplicación para su envío al servicio de intercambio de mensajes.
      * @param msg Apuntador a una estructura para almacenar la trama. @see msg_t
      */
    void toStruct(struct msg_t*);
};


#endif /* MESSAGE_H_ */
